package com.texaco.chapasFutbol.camera;

import java.util.Date;

import org.andengine.engine.camera.SmoothCamera;
import org.andengine.entity.IEntity;
import org.andengine.input.touch.TouchEvent;

import android.content.res.Resources;

import com.texaco.chapasFutbol.R;
import com.texaco.chapasFutbol.entidades.Game;

/**
 * Maneja la cámara del juego.
 * @author texaco
 *
 */
public class CameraHandler 
{

	/**
	 * Tiempo permitido entre pulsaciones para resetear la cámara.
	 */
	public final static long RESET_ZOOM_GAP_TIME = 75;
	
	private Game game;
	
	/**
	 * Indica el tiempo pasado desde el último toque en la pantalla.
	 */
	private long tapTime;
	
	public CameraHandler(Game game){
		this.game = game;
	}
	
	/**
	 * Resetea la cámara.
	 */
	public void resetCamera(){
		Resources resources = game.getActivity().getResources();
		chaseEntity(null);
		getCamera().reset();
		getCamera().setZoomFactor((float)resources.getInteger(R.integer.ini_zoom_factor)/100f);
		getCamera().setCenter(resources.getInteger(R.integer.game_place_width)/2, resources.getInteger(R.integer.game_place_height)/2);
	}
	
	/**
	 * Resetea la cámara.
	 */
	public void resetCameraMenu(){
		chaseEntity(null);
		getCamera().reset();
		getCamera().setZoomFactorDirect(1);
		getCamera().setCenterDirect(getCamera().getWidth()/2, getCamera().getHeight()/2);
	}
	
	

	/**
	 * Establece cámara de persecución.
	 * @return
	 */
	public void chaseEntity(IEntity entity){
		Resources resources = game.getActivity().getResources();
		getCamera().setChaseEntity(entity);
		if(entity != null){
			getCamera().setMaxVelocity(resources.getInteger(R.integer.cam_min_vel_x), resources.getInteger(R.integer.cam_min_vel_y));
			getCamera().setMaxZoomFactorChange(resources.getInteger(R.integer.cam_min_vel_zoom));
		}else{
			getCamera().setMaxVelocity(resources.getInteger(R.integer.cam_max_vel_x), resources.getInteger(R.integer.cam_max_vel_y));
			getCamera().setMaxZoomFactorChange(resources.getInteger(R.integer.cam_max_vel_zoom));
		}
	}

	/**
	 * Detecta si estamos ante un evento de resetear el zoom de la cámara.
	 * 
	 * @param pSceneTouchEvent
	 * @return
	 */
	public boolean isResetEvent(TouchEvent pSceneTouchEvent) {
		if(pSceneTouchEvent.getPointerID() == 0){
			if(pSceneTouchEvent.isActionUp() && this.tapTime == 0){
				this.tapTime = new Date().getTime();
			}else{
				if ((new Date().getTime() - this.tapTime) < RESET_ZOOM_GAP_TIME) {
					this.tapTime = 0;
					return true;
				}
				this.tapTime = 0;
			}
		}else{
			this.tapTime = 0;
		}
		return false;
	}

	private SmoothCamera getCamera() {
		return (SmoothCamera) game.getActivity().getEngine().getCamera();
	}
}
